package management;

import java.io.IOException;
import java.io.ObjectOutputStream;

import microcontroler.MicroControler;
import tasks.ChangeTemp;
import tasks.TaskThread;
import tasks.TurnBathroomLightOff;
import tasks.TurnBathroomLightOn;
import tasks.TurnKitchenLightOff;
import tasks.TurnKitchenLightOn;
import tasks.TurnRoomLightOff;
import tasks.TurnRoomLightOn;

import com.managment.data.Media;
import com.managment.data.Task;
import com.managment.functions.add.AddFailed;
import com.managment.functions.add.TaskAdded;

import engine.Utils;

public class Scheduler {
	public static TaskThread addTask(Task current_task, MicroControler mc, ObjectOutputStream oos, boolean repeatable) throws IOException{
		if(current_task.getMedia().equals(Media.BATHROOMLIGHT)){
			if(current_task.getState().equals("on")){
				TaskAdded ta = new TaskAdded();
				if(current_task.getEventTime() != null){
					TurnBathroomLightOn tbl_on = new TurnBathroomLightOn(mc);
					tbl_on.setTask(current_task);
					tbl_on.setRepeatable(repeatable);
					tbl_on.start();
					ta.setMessage(Utils.getSysTime()+" - Ustawiono zapalenie światła w łazience");
					System.out.println(Utils.getSysTime()+" - Ustawiono zapalenie światła w łazience");
					return tbl_on;
				}
				else{
					mc.turnLightOnInBathroom();
					ta.setMessage(Utils.getSysTime()+" - Zapalono światło w łazience");
					System.out.println(Utils.getSysTime()+" - Zapalono światło w łazience");
					
				}
				if(!repeatable)
					oos.writeObject(ta);
			}
				
			else if(current_task.getState().equals("off")){
				TaskAdded ta = new TaskAdded();
				if(current_task.getEventTime() != null){
					TurnBathroomLightOff tbl_off = new TurnBathroomLightOff(mc);
					tbl_off.setTask(current_task);
					tbl_off.setRepeatable(repeatable);
					tbl_off.start();
					ta.setMessage(Utils.getSysTime()+" - Ustawiono Zgaszenie światła w łazience");
					System.out.println(Utils.getSysTime()+" - Ustawiono Zgaszenie światła w łazience");
					return tbl_off;
				}
				else{
					mc.turnLightOffInBathroom();
					ta.setMessage(Utils.getSysTime()+" - Zgaszono światło w łazience");
					System.out.println(Utils.getSysTime()+" - Zgaszono światło w łazience");
					
				}	
				if(!repeatable)
					oos.writeObject(ta);	
			}
			else{
				AddFailed fail = new AddFailed();
				fail.setMessage(Utils.getSysTime()+" - Podano nieprawidłowy stan medium");
				if(!repeatable)
					oos.writeObject(fail);
				System.out.println(Utils.getSysTime()+" - Podano nieprawdiłowy stan medium");
			}
		}
		else if(current_task.getMedia().equals(Media.KITCHENLIGHT)){
			if(current_task.getState().equals("on")){
				TaskAdded ta = new TaskAdded();
				if(current_task.getEventTime() != null){
					TurnKitchenLightOn tkl_on = new TurnKitchenLightOn(mc);
					tkl_on.setTask(current_task);
					tkl_on.setRepeatable(repeatable);
					tkl_on.start();
					ta.setMessage(Utils.getSysTime()+" - Ustawiono zapalenie światła w kuchni");
					System.out.println(Utils.getSysTime()+" - Ustawiono zapalenie światła w kuchni");
					return tkl_on;
				}
				else{
					mc.turnLightOnInKitchen();
					ta.setMessage(Utils.getSysTime()+" - Zapalono światło w kuchni");
					System.out.println(Utils.getSysTime()+" - Zapalono światło w kuchni");
					
				}
				if(!repeatable)
					oos.writeObject(ta);
			}
			else if(current_task.getState().equals("off")){
				TaskAdded ta = new TaskAdded();
				if(current_task.getEventTime() != null){
					TurnKitchenLightOff tkl_off = new TurnKitchenLightOff(mc);
					tkl_off.setTask(current_task);
					tkl_off.setRepeatable(repeatable);
					tkl_off.start();
					ta.setMessage(Utils.getSysTime()+" - Ustawiono zgaszenie swiatła w kuchni");
					System.out.println(Utils.getSysTime()+" - Ustawiono zgaszenie światła w kuchni");
					return tkl_off;
				}
				else{
					mc.turnLightOffInKitchen();
					ta.setMessage(Utils.getSysTime()+" - Zgaszono światło w kuchni");
					System.out.println(Utils.getSysTime()+" - Zgaszono światło w kuchni");
					
				}
				if(!repeatable)
					oos.writeObject(ta);
			}
			else{
				AddFailed fail = new AddFailed();
				fail.setMessage(Utils.getSysTime()+" - Podano nieprawidłowy stan medium");
				if(!repeatable)
					oos.writeObject(fail);
				System.out.println(Utils.getSysTime()+" - Podano nieprawdiłowy stan medium");
			}
		}
		else if(current_task.getMedia().equals(Media.ROOMLIGHT)){
			if(current_task.getState().equals("on")){
				TaskAdded ta = new TaskAdded();
				if(current_task.getEventTime() != null){
					TurnRoomLightOn trl_on = new TurnRoomLightOn(mc);
					trl_on.setTask(current_task);
					trl_on.setRepeatable(repeatable);
					trl_on.start();
					ta.setMessage(Utils.getSysTime()+" - Ustawiono zapalenie światła w pokoju");
					System.out.println(Utils.getSysTime()+" - Ustawiono zapalenie światło w pokoju");
					return trl_on;
				}
				else{
					mc.turnLightOnInRoom();
					ta.setMessage(Utils.getSysTime()+" - Zapalono światło w pokoju");
					System.out.println(Utils.getSysTime()+" - Zapalono światło w pokoju");
					
				}
				
				if(!repeatable)
					oos.writeObject(ta);
				
			}
			else if(current_task.getState().equals("off")){
				TaskAdded ta = new TaskAdded();
				if(current_task.getEventTime() != null){
					TurnRoomLightOff trl_off = new TurnRoomLightOff(mc);
					trl_off.setTask(current_task);
					trl_off.setRepeatable(repeatable);
					trl_off.start();
					ta.setMessage(Utils.getSysTime()+" - Ustawiono zgaszenie światła w pokoju");
					System.out.println(Utils.getSysTime()+" - Ustawiono zgaszenie światła w pokoju");
					return trl_off;
				}
				else{
					mc.turnLightOffInRoom();
					ta.setMessage(Utils.getSysTime()+" - Zgaszono światło w pokoju");
					System.out.println(Utils.getSysTime()+" - Zgaszono światło w pokoju");
					
				}
				
				if(!repeatable)
					oos.writeObject(ta);
				
			}
			else{
				AddFailed fail = new AddFailed();
				fail.setMessage(Utils.getSysTime()+" - Podano nieprawidłowy stan medium");
				if(!repeatable)
					oos.writeObject(fail);
				System.out.println(Utils.getSysTime()+" - Podano nieprawdiłowy stan medium");
			}
		}	
		else if(current_task.getMedia().equals(Media.HEATTER)){
			TaskAdded ta = new TaskAdded();
			if(current_task.getEventTime() != null){
				ChangeTemp ct = new ChangeTemp(mc);
				ct.setRepeatable(repeatable);
				ct.setTask(current_task);
				ct.start();
				ta.setMessage(Utils.getSysTime()+" - Ustawiono zmianę temperatury na "+current_task.getState()+" stopni");
				System.out.println(Utils.getSysTime()+" - Ustawiono zmianę temperatury na "+current_task.getState()+" stopni");
				return ct;
			}
			else{
				mc.setHeatingTemperature(Integer.valueOf(current_task.getState()));
				ta.setMessage(Utils.getSysTime()+" - Zmieniono temperaturę na "+current_task.getState()+" stopni");
				System.out.println(Utils.getSysTime()+" - Zmieniono temperaturę na "+current_task.getState()+" stopni");
				
			}
			if(!repeatable)
				oos.writeObject(ta);
		}
		else {
			AddFailed fail = new AddFailed();
			fail.setMessage(Utils.getSysTime()+" - Podano nieprawidłowe medium");
			if(!repeatable)
				oos.writeObject(fail);
			System.out.println(Utils.getSysTime()+" - Podano nieprawdiłowe medium");
		}
		return null;
	}
}
